home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hottest 6
/
Hottest 6 (1996)(PDSoft)[!].iso
/
software
/
emulators
/
frodo_1.5
/
src
/
6581.asm
< prev
next >
Wrap
Assembly Source File
|
1978-11-24
|
5KB
|
279 lines
*
* 6581.asm - SID-Emulation
*
* Copyright (C) 1994-1995 by Christian Bauer
*
*
* Anmerkungen:
* ------------
*
* Funktionsprinzip:
* - Es bestehen zwei Möglichkeiten zur SID-Emulation, die über das
* Flag UseSIDCard ausgewählt werden. Zum einen die Verwendung der
* SID-Karte, zum anderen die der "6581sid.library"
*
* SID-Karte:
* - Die SID-Karte enthält einen echten C64-SID, der im Adreßraum
* $a00001-$a00039 (Register an den ungeraden Adressen) eingeblendet
* ist (z.B. auf einer Zorro-II-Karte)
* - Wegen Timing-Problemen mit der Karte werden Lesezugriffe aus
* SID-Registern nur simuliert
* - Die Power-LED ist mit dem Reset-Eingang des SID verbunden,
* d.h. ein kurzes Aus- und Einschalten der LED setzt den SID
* zurück
*
MACHINE 68020
INCLUDE "exec/types.i"
INCLUDE "exec/macros.i"
INCLUDE "exec/nodes.i"
INCLUDE "hardware/intbits.i"
XREF _SysBase
XREF _GfxBase
XREF _SID6581Base
XREF Random
XDEF Reset6581
XDEF ReadFrom6581
XDEF WriteTo6581
XDEF PauseSound
XDEF ResumeSound
XDEF ChangedSID
XDEF CloseSID
XDEF UseSIDCard ;Prefs
SECTION "CODE",CODE
*
* Definitionen
*
; 6581sid.library
SID_AllocSID = -30
SID_FreeSID = -36
SID_Interrupt = -42
SID_Initialize = -48
SID_ResetSID = -54
SID_IRQOnOff = -60
SID_ReadReg = -72
SID_WriteReg = -78
; SID Handle Struktur
sid_Enabled = 4
sid_Filter = 5
sid_60Hz = 6
sid_RingQual = 7
sid_SyncQual = 8
sid_ADSRQual = 13
sid_IRQRate = 18
**
** SID-Einstellung wurde verändert.
** Emulation über Library ein-/ausschalten
**
ChangedSID tst.w UseSIDCard
beq OpenSID
; Emulation über Library ausschalten
CloseSID move.l SIDHandle,d0
beq 1$
move.l a6,-(sp)
move.l _SID6581Base,a6 ;SID abschalten
move.l d0,a1
moveq #-1,d0
jsr SID_IRQOnOff(a6)
move.l _SysBase,a6 ;VBI entfernen
lea VBInterrupt,a1
moveq #INTB_VERTB,d0
JSRLIB RemIntServer
move.l _SID6581Base,a6
move.l SIDHandle,a1 ;Und SIDHandle freigeben
jsr SID_FreeSID(a6)
clr.l SIDHandle
move.l (sp)+,a6
1$ rts
; Emulation über Library einschalten
OpenSID tst.l SIDHandle
bne 1$
move.l _SID6581Base,d0 ;6581sid.library offen?
beq 1$
move.l a6,-(sp) ;Ja, SIDHandle holen
move.l d0,a6
jsr SID_AllocSID(a6)
move.l d0,SIDHandle
beq 2$
move.l d0,a1 ;Parameter setzen
st.b sid_Enabled(a1)
clr.b sid_Filter(a1)
st.b sid_60Hz(a1)
move.b #48,sid_RingQual(a1)
move.b #48,sid_SyncQual(a1)
move.b #48,sid_ADSRQual(a1)
move.w #60,sid_IRQRate(a1)
jsr SID_Initialize(a6)
move.l SIDHandle,a1 ;SID anschalten
moveq #0,d0
jsr SID_IRQOnOff(a6)
move.l _SysBase,a6 ;VBI einrichten
lea VBInterrupt,a1
moveq #INTB_VERTB,d0
JSRLIB AddIntServer
2$ move.l (sp)+,a6
1$ rts
**
** Interrupt-Routine
** a1: SIDHandle
**
IntProc move.l _SID6581Base,a6
jsr SID_Interrupt(a6)
moveq #0,d0 ;Nächsten Server aufrufen
rts
**
** Sound stummschalten
**
PauseSound move.l SIDHandle,d0
beq 1$
move.l a6,-(sp)
move.l _SID6581Base,a6
move.l d0,a1
moveq #-1,d0
jsr SID_IRQOnOff(a6)
move.l (sp)+,a6
1$ rts
**
** Sound wieder laut machen
**
ResumeSound move.l SIDHandle,d0
beq 1$
move.l a6,-(sp)
move.l _SID6581Base,a6
move.l d0,a1
moveq #0,d0
jsr SID_IRQOnOff(a6)
move.l (sp)+,a6
1$ rts
**
** SID zurücksetzen
**
Reset6581 move.l a6,-(sp)
tst.w UseSIDCard
beq 1$
move.l _GfxBase,a6
JSRLIB WaitTOF
bset #1,$bfe001 ;LED aus
JSRLIB WaitTOF
bclr #1,$bfe001 ;LED an
move.l (sp)+,a6
rts
1$ move.l SIDHandle,d0
beq 2$
move.l _SID6581Base,a6
move.l d0,a1
jsr SID_ResetSID(a6)
2$ move.l (sp)+,a6
rts
**
** Aus einem SID-Register lesen
** d0.w: Registernummer ($00-$1f)
** Rückgabe: d0.b: Byte
**
** Darf das obere Wort von d0 und d1 nicht verändern!
** Darf a1 nicht verändern!
**
ReadFrom6581 cmp.b #$19,d0
beq ReadFF
cmp.b #$1a,d0
beq ReadFF
cmp.b #$1b,d0
beq ReadRnd
moveq #0,d0
rts
ReadFF move.b #-1,d0 ;A/D-Wandler
rts
ReadRnd jsr Random
moveq #0,d1 ;MSW löschen
rts
**
** In ein SID-Register schreiben
** d0.w: Registernummer ($00-$1f)
** d1.b: Byte
**
** Darf das obere Wort von d0 und d1 nicht verändern!
**
WriteTo6581 tst.w UseSIDCard
beq 1$
lea $a00001,a0 ;SID-Karte
move.b d1,(a0,d0.w*2)
rts
1$ tst.l SIDHandle
beq 2$
move.l a6,-(sp)
move.l _SID6581Base,a6
move.l SIDHandle,a1 ;d0: Regnum, d1: Byte
jsr SID_WriteReg(a6)
move.l (sp)+,a6
moveq #0,d0
moveq #0,d1
2$ rts
**
** Konstanten
**
IntName dc.b "Frodo SID VBI",0
**
** Datenbereich
**
SECTION "DATA",DATA
VBInterrupt dc.l 0,0
dc.b NT_INTERRUPT,0
dc.l IntName
SIDHandle dc.l 0 ;Handle für die 6581sid.library und Flag, daß sie verfügbar ist
dc.l IntProc
UseSIDCard dc.w 0 ;Flag: SID-Karte ansprechen
END